package cc.rengu.oltp.service.realize;

import cc.rengu.oltp.service.common.enums.PinTypeEnum;

/**
 * 加密平台接口类
 * Created by wangcheng on 2021/3/26 9:43
 * ZMK-区域主密钥（又称BMK）    ZEK-区域加密密钥       ZAK-区域认证密钥（又称MAK）    ZPK-区域PIN密钥（又称PIK）
 * LMK-本地主密钥             TMK-终端主密钥         TAK-终端认证密钥             TPK-终端PIN密钥
 * PIN-个人身份号码           MAC-信息认证码         PVK-PIN校验密钥              CVK-卡校验密钥
 */
public interface HsmService {
    /**
     * 生成ZMK加密的TMK密钥
     *
     * @param instId 多法人标识
     * @param keyTag 密钥标签
     * @return 加密后的TMK及TMK校验值，String[0]为密钥值，String[1]为校验值
     * @throws Exception 异常
     */
    String[] hsmGenerateTmkByZmk(String instId, String keyTag) throws Exception;

    /**
     * 生成TMK加密的TPK密钥
     *
     * @param instId 多法人标识
     * @param keyTag 密钥标签
     * @return 加密后的TPK及TPK校验值，String[0]为密钥值，String[1]为校验值
     * @throws Exception 异常
     */
    String[] hsmGenerateTpkByTmk(String instId, String keyTag) throws Exception;

    /**
     * 生成TMK加密的TAK密钥
     *
     * @param instId 多法人标识
     * @param keyTag 密钥标签
     * @return 加密后的TAK及TAK校验值，String[0]为密钥值，String[1]为校验值
     * @throws Exception 异常
     */
    String[] hsmGenerateTakByTmk(String instId, String keyTag) throws Exception;

    /**
     * 生成MAC值
     *
     * @param instId       多法人标识
     * @param keyTag       密钥标签
     * @param macBlockData 待计算MAC的数据
     * @return MAC值
     * @throws Exception 异常
     */
    String hsmGenerateMac(String instId, String keyTag, String macBlockData) throws Exception;

    /**
     * 生成签名字符串
     *
     * @param instId        多法人标识
     * @param certKey       签约证书
     * @param signBlock     待加签字符串
     * @param algorithmType 签名算法
     * @return 加签字符串
     * @throws Exception 异常
     */
    String hsmGenerateSignString(String instId, String certKey, String signBlock, String algorithmType) throws Exception;

    /**
     * 验证签约
     *
     * @param instId        多法人标识
     * @param certKey       验证证书
     * @param signBlock     待验签字符串
     * @param algorithmType 签名算法
     * @param signData      签名值
     * @return true-验证通过,false-验签失败
     * @throws Exception 异常
     */
    boolean hsmVerifySignString(String instId, String certKey, String signBlock, String algorithmType, String signData) throws Exception;

    /**
     * 加密数据
     *
     * @param instId        多法人标识
     * @param keyTag        密钥标签
     * @param algorithmType 算法类型
     * @param data          待加密的数据
     * @return 加密后的数据
     * @throws Exception 异常
     */
    String hsmEncryptData(String instId, String keyTag, String algorithmType, String data) throws Exception;

    /**
     * 数据解密
     *
     * @param instId        多法人标识
     * @param keyTag        密钥标签
     * @param algorithmType 算法类型
     * @param data          待解密的数据
     * @return 解密后的数据
     * @throws Exception 异常
     */
    String hsmDecryptData(String instId, String keyTag, String algorithmType, String data) throws Exception;

    /**
     * 产生PIN密文的offset
     *
     * @param instId    多法人标识
     * @param srcKeyTag ZPK加密密钥标签
     * @param dstKeyTag PVK加密密钥标签
     * @param acctNo    账号
     * @param pinType   密码类型
     * @param pinData   加密的密文
     * @return PIN密文的offset
     * @throws Exception 异常
     */
    String hsmGeneratePinOffset(String instId, String srcKeyTag, String dstKeyTag, String acctNo, PinTypeEnum pinType, String pinData) throws Exception;

    /**
     * 校验PIN
     *
     * @param instId        多法人标识
     * @param srcKeyTag     ZPK加密密钥标签
     * @param dstKeyTag     PVK加密密钥标签
     * @param acctNo        账号
     * @param pinType       密码类型
     * @param pinData       加密的密文
     * @param pinCheckValue 加密密文校验值
     * @return true-校验通过，false-校验失败
     * @throws Exception 异常
     */
    boolean hsmVerifyPin(String instId, String srcKeyTag, String dstKeyTag, String acctNo, PinTypeEnum pinType, String pinData, String pinCheckValue) throws Exception;

    /**
     * 修改密码并返回修改后的PIN密文或offset
     *
     * @param instId        多法人标识
     * @param srcKeyTag     ZPK加密密钥标签
     * @param dstKeyTag     PVK加密密钥标签
     * @param acctNo        账号
     * @param pinType       密码类型
     * @param pinData       修改前的加密密文
     * @param pinCheckValue 修改前的密文校验值
     * @param newPinData    修改后的加密密文
     * @return 修改后的PIN密文或offset
     * @throws Exception 异常
     */
    String hsmModifyPin(String instId, String srcKeyTag, String dstKeyTag, String acctNo, PinTypeEnum pinType, String pinData, String pinCheckValue, String newPinData) throws Exception;

    /**
     * 转PIN
     *
     * @param instId    多法人标识
     * @param srcKeyTag 源密钥标签
     * @param dstKeyTag 目标密钥标签
     * @param srcAcctNo 源账号标识
     * @param dstAcctNo 目标账号标识
     * @param pinData   PIN密文
     * @return 转换后的PIN密文
     * @throws Exception 异常
     */
    String hsmTranslatePin(String instId, String srcKeyTag, String dstKeyTag, String srcAcctNo, String dstAcctNo, String pinData) throws Exception;

    /**
     * 将PIN密文从RSA国际非对称算法转换成对称算法
     *
     * @param instId    多法人标识
     * @param srckeyTag 非对称密钥密钥标签
     * @param dstKeyTag 对称密钥密钥标签
     * @param acctNo    账号
     * @param pinType   密码类型
     * @param pinData   公钥加密的密文
     * @return 对称密钥(ZPK)加密的密文
     * @throws Exception 异常
     */
    String hsmTransPinRsaToDes(String instId, String srckeyTag, String dstKeyTag, String acctNo, PinTypeEnum pinType, String pinData) throws Exception;

    /**
     * 将PIN密文从SM2国密非对称算法转换成对称算法
     *
     * @param instId    多法人标识
     * @param srckeyTag 非对称密钥密钥标签
     * @param dstKeyTag 对称密钥密钥标签
     * @param acctNo    账号
     * @param pinType   密码类型
     * @param pinData   公钥加密的密文
     * @return 对称密钥(ZPK)加密的密文
     * @throws Exception 异常
     */
    String hsmTransPinSm2ToDes(String instId, String srckeyTag, String dstKeyTag, String acctNo, PinTypeEnum pinType, String pinData) throws Exception;

    /**
     * 将PIN密文从对称算法转换成非RSA国际非对称算法
     *
     * @param instId    多法人标识
     * @param srckeyTag 对称密钥密钥标签
     * @param dstKeyTag 非对称密钥密钥标签
     * @param acctNo    账号
     * @param pinType   密码类型
     * @param pinData   公钥加密的密文
     * @return 对称密钥(ZPK)加密的密文
     * @throws Exception 异常
     */
    String hsmTransPinDesToRsa(String instId, String srckeyTag, String dstKeyTag, String acctNo, PinTypeEnum pinType, String pinData) throws Exception;

    /**
     * 将PIN密文从对称算法转换成非SM2国密非对称算法
     *
     * @param instId    多法人标识
     * @param srckeyTag 对称密钥密钥标签
     * @param dstKeyTag 非对称密钥密钥标签
     * @param acctNo    账号
     * @param pinType   密码类型
     * @param pinData   公钥加密的密文
     * @return 对称密钥(ZPK)加密的密文
     * @throws Exception 异常
     */
    String hsmTransPinDesToSm2(String instId, String srckeyTag, String dstKeyTag, String acctNo, PinTypeEnum pinType, String pinData) throws Exception;

    /**
     * 将PIN密文从ZPK加密转换成PVK加密
     *
     * @param instId    多法人标识
     * @param srcKeyTag ZPK加密密钥标签
     * @param dstKeyTag PVK加密密钥标签
     * @param srcAcctNo 源账号
     * @param dstAcctNo 目标账号
     * @param pinType   密码类型
     * @param pinData   加密的密文
     * @return PVK加密的密文
     * @throws Exception 异常
     */
    String hsmTransPinZpkToPvk(String instId, String srcKeyTag, String dstKeyTag, String srcAcctNo, String dstAcctNo, PinTypeEnum pinType, String pinData) throws Exception;
}
